package main

import (
	"fmt"
)

// Data 是一个简单结构体
type Data struct {
	value int
}

// stackAllocated 中的 d 只在函数内部使用，不会逃逸
func stackAllocated() {
	d := Data{value: 42}
	fmt.Println("stack value:", d.value)
}

// heapAllocated 返回局部变量的指针，d 会逃逸到堆上
func heapAllocated() *Data {
	d := Data{value: 99}
	return &d // 返回指针，触发逃逸
}

// interfaceEscape 将局部变量赋值给 interface{}，也会触发逃逸
func interfaceEscape() {
	d := Data{value: 7}
	var any interface{} = d // d 会被复制到堆上
	fmt.Println("interface holds:", any)
}

func main() {
	stackAllocated()
	p := heapAllocated()
	fmt.Println("heap value:", p.value)

	interfaceEscape()
}
